package com.letcode.study.simple;

/**
 * 买卖股票的最佳时机 II
 * 给你一个整数数组 prices ，其中 prices[i] 表示某支股票第 i 天的价格。
 * <p>
 * 在每一天，你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买，然后在 同一天 出售。
 * <p>
 * 返回 你能获得的 最大 利润 。
 * <p>
 * 作者：力扣 (LeetCode)
 * 链接：https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2zsx1/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 *
 * @Date 2022/11/9 14:37:39
 * @Author luopeng
 */
public class MaxProfit {
    public static void main(String[] args) {
        int[] price = {7, 1, 5, 3, 6, 4};
        System.out.println(maxProfit(price));
        System.out.println(maxProfit1(price));
    }

    /**
     * 以折线图方式理解，上升的段为有利润的，将所有上升段之间的总和加起来即可
     *
     * @param prices
     * @return
     */
    public static int maxProfit(int[] prices) {
        int index = 0, length = prices.length, count = 0, lower;
        while (index < length) {
            // 一直找，直到找出路径中最小的临界点
            while (index < length - 1 && prices[index] >= prices[index + 1]) {
                ++index;
            }
            lower = prices[index];
            // 一直找，直到找出路径中最大值的临界点
            while (index < length - 1 && prices[index] <= prices[index + 1]) {
                ++index;
            }
            count += prices[index++] - lower;
        }
        return count;
    }

    /**
     * 贪心算法求解，计算每两个数之间的差值（后面-前面），将所有正数加起来
     *
     * @param prices
     * @return
     */
    public static int maxProfit1(int[] prices) {
        int count = 0,temp;
        for (int i = 0; i < prices.length - 1; i++) {
            temp = prices[i + 1] - prices[i];
            if (temp > 0) {
                count += temp;
            }
        }
        return count;
    }
}
